//=====================================================================
//
//
//
//=====================================================================
#ifndef KALEIDOSCOPE_GENERATOR_SEMANTIC_ANALYSIS_PASS_HPP
#define KALEIDOSCOPE_GENERATOR_SEMANTIC_ANALYSIS_PASS_HPP
//=====================================================================
#include <sooty/common/value_t.hpp>
#include <sooty/frontend/syntactic_analysis/parseme.hpp>
#include <sooty/frontend/semantic_analysis/symbol_table.hpp>
//=====================================================================
#include <kaleidoscope/kaleidoscope.hpp>
#include <kaleidoscope/frontend/semantic_analysis/scope.hpp>
//=====================================================================
KALEIDOSCOPE_BEGIN
//=====================================================================
	
	//=====================================================================
	//
	//  
	//
	//=====================================================================
	/*
	class semantic_analysis_pass
	{
		typedef atma::sooty::parseme_ptr parseme_ptr;
		typedef atma::sooty::parseme_ptr_ref parseme_ptr_ref;
		typedef atma::sooty::const_parseme_ptr_ref const_parseme_ptr_ref;
		
		atma::sooty::symbol_table* value_table_;
		atma::sooty::symbol_table* type_table_;
		
		parseme_ptr root_;
		
		atma::sooty::symbol_table& value_table() { return *value_table_; }
		atma::sooty::symbol_table& type_table() { return *type_table_; }
		
	public:
		void operator()(const_parseme_ptr_ref root, atma::sooty::symbol_table& vt, atma::sooty::symbol_table& tt)
		{
			root_ = root;
			value_table_ = &vt;
			type_table_ = &tt;
			start_rule(root_);
		}
		
	protected:
		void start_rule(const_parseme_ptr_ref);		
		void function(const_parseme_ptr_ref);
		void parameter(const_parseme_ptr_ref);
		void function_body(const_parseme_ptr_ref);
		void return_statement(const_parseme_ptr_ref);
		void function_call(const_parseme_ptr_ref);
		
		
		std::string stringize_type(const_parseme_ptr_ref);
	};
	
	*/
	
	namespace semantic_analysis
	{
		namespace detail
		{
			void start_rule(int&, atma::sooty::const_parseme_ptr_ref);		
			void function(int&, atma::sooty::const_parseme_ptr_ref);
			void parameter(int&, atma::sooty::const_parseme_ptr_ref);
			void function_body(int&, atma::sooty::const_parseme_ptr_ref);
			void return_statement(int&, atma::sooty::const_parseme_ptr_ref);
			void function_call(int&, atma::sooty::const_parseme_ptr_ref);
		}
	}
	
	
	namespace semantic_analysis
	{
		// should return the number of errors
		inline int pass(atma::sooty::const_parseme_ptr_ref ast_root)
		{
			int result = 0;
			detail::start_rule(result, ast_root);
			return result;
		}
	}
	
//=====================================================================
KALEIDOSCOPE_CLOSE
//=====================================================================
#endif
//=====================================================================
